package com.ddyx.SMS.service.impl;

import org.springframework.stereotype.Service;

import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.dysmsapi.model.v20170525.SendBatchSmsRequest;
import com.aliyuncs.dysmsapi.model.v20170525.SendBatchSmsResponse;
import com.aliyuncs.dysmsapi.model.v20170525.SendSmsRequest;
import com.aliyuncs.dysmsapi.model.v20170525.SendSmsResponse;
import com.aliyuncs.http.MethodType;
import com.aliyuncs.profile.DefaultProfile;
import com.aliyuncs.profile.IClientProfile;
import com.ddyx.SMS.service.IALISMSService;
import com.ddyx.common.PropertiesUtil;

@Service
public class ALISMSServiceService implements IALISMSService {
	
	private static final String product = "Dysmsapi";//短信API产品名称（短信产品名固定，无需修改）
	private static final String domain = "dysmsapi.aliyuncs.com";//短信API产品域名（接口地址固定，无需修改）
	
	private IAcsClient acsClient;
	
	public ALISMSServiceService() throws Exception {
		//设置超时时间-可自行调整
		System.setProperty("sun.net.client.defaultConnectTimeout", "10000");
		System.setProperty("sun.net.client.defaultReadTimeout", "10000");
		String accessKeyId = PropertiesUtil.getValue("ALISMS.accessKeyId");
	    String accessKeySecret = PropertiesUtil.getValue("ALISMS.accessKeySecret");
	    String regionid = PropertiesUtil.getValue("ALISMS.region");
	    IClientProfile profile = DefaultProfile.getProfile(regionid, accessKeyId, accessKeySecret);
	    DefaultProfile.addEndpoint(regionid, regionid, product, domain);
	    acsClient = new DefaultAcsClient(profile);
	}
	
	/**
	 * <p>Title: sendSMSOne</p>
	 * <p>Description: 
	 * 		发短信(单发或群发)(发送内容一样)
	 * </p>
	 * @return
	 * @throws Exception
	 */
	private Boolean sendSMSOne(SendSmsRequest request) throws Exception {
		//组装请求对象
		//SendSmsRequest request = new SendSmsRequest();
		//使用post提交
		request.setMethod(MethodType.POST);
		 //必填:待发送手机号。支持以逗号分隔的形式进行批量调用，批量上限为1000个手机号码,批量调用相对于单条调用及时性稍有延迟,验证码类型的短信推荐使用单条调用的方式
		 //request.setPhoneNumbers("18618488086");
		 //必填:短信签名-可在短信控制台中找到
		 //request.setSignName("叮当一下");
		 //必填:短信模板-可在短信控制台中找到
		 //request.setTemplateCode("SMS_130750101");
		 //可选:模板中的变量替换JSON串,如模板内容为"亲爱的${name},您的验证码为${code}"时,此处的值为
		 //友情提示:如果JSON中需要带换行符,请参照标准的JSON协议对换行符的要求,比如短信内容中包含\r\n的情况在JSON中需要表示成\\r\\n,否则会导致JSON在服务端解析失败
		 //request.setTemplateParam("{\"name\":\"Tom\", \"code\":\"123\"}");
		 //request.setTemplateParam("{\"code\":\"123cesshi\"}");
		 //可选-上行短信扩展码(扩展码字段控制在7位或以下，无特殊需求用户请忽略此字段)
		 //request.setSmsUpExtendCode("90997");
		 //可选:outId为提供给业务方扩展字段,最终在短信回执消息中将此值带回给调用者
		 //request.setOutId("yourOutId");
		//请求失败这里会抛ClientException异常
		SendSmsResponse sendSmsResponse = acsClient.getAcsResponse(request);
		System.out.println(sendSmsResponse.getCode());
		System.out.println(sendSmsResponse.getMessage());
		if(sendSmsResponse.getCode() != null && sendSmsResponse.getCode().equals("OK")) {
		//请求成功
			System.out.println(12);
			return true;
		}
		return false;
	}
	
	@Override
	public Boolean sendSMS(SendSmsRequest request) {
		try {
			return sendSMSOne(request);
		} catch (Exception e) {
			return false;
		}
	}

	/**
	 * <p>Title: sendSMSAll</p>
	 * <p>Description: 
	 * 		发短信(支持不同的号码发送不同的短信签名)
	 * </p>
	 * @return
	 * @throws Exception
	 */
	private Boolean sendSMSAll(SendBatchSmsRequest request) throws Exception {
		 //组装请求对象
		 //SendBatchSmsRequest request = new SendBatchSmsRequest();
		 //使用post提交
		 request.setMethod(MethodType.POST);
		 //必填:待发送手机号。支持JSON格式的批量调用，批量上限为100个手机号码,批量调用相对于单条调用及时性稍有延迟,验证码类型的短信推荐使用单条调用的方式
		 //request.setPhoneNumberJson("[\"1500000000\",\"1500000001\"]");
		 //必填:短信签名-支持不同的号码发送不同的短信签名
		 //request.setSignNameJson("[\"云通信\",\"云通信\"]");
		 //必填:短信模板-可在短信控制台中找到
		 //request.setTemplateCode("SMS_1000000");
		 //必填:模板中的变量替换JSON串,如模板内容为"亲爱的${name},您的验证码为${code}"时,此处的值为
		 //友情提示:如果JSON中需要带换行符,请参照标准的JSON协议对换行符的要求,比如短信内容中包含\r\n的情况在JSON中需要表示成\\r\\n,否则会导致JSON在服务端解析失败
		 //request.setTemplateParamJson("[{\"name\":\"Tom\", \"code\":\"123\"},{\"name\":\"Jack\", \"code\":\"456\"}]");
		 //可选-上行短信扩展码(扩展码字段控制在7位或以下，无特殊需求用户请忽略此字段)
		 //request.setSmsUpExtendCodeJson("[\"90997\",\"90998\"]");
		//请求失败这里会抛ClientException异常
		SendBatchSmsResponse sendSmsResponse = acsClient.getAcsResponse(request);
		if(sendSmsResponse.getCode() != null && sendSmsResponse.getCode().equals("OK")) {
		//请求成功
			return true;
		}
		return false;
	}
	
	@Override
	public Boolean sendBatchSms(SendBatchSmsRequest request) {
		try {
			return sendSMSAll(request);
		} catch (Exception e) {
			return false;
		}
	}
	

}
